#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <signal.h>		/* signal */

/*
 * 获取调用者函数地址
 *
 *	0表示 当前函数的返回地址，1表示当前函数的调用者的返回地址，依此类推
 */

void func_e(void)
{
    printf("func_e(0)=%p\n", __builtin_return_address(0));	/* 打印返回层级地址 */
    printf("func_e(1)=%p\n", __builtin_return_address(1));
    printf("func_e(2)=%p\n", __builtin_return_address(2));
    printf("func_e(3)=%p\n", __builtin_return_address(3));
    printf("func_e(4)=%p\n", __builtin_return_address(4));
    printf("func_e(5)=%p\n", __builtin_return_address(5));
}

void func_d(void)
{
    func_e();
}

void func_c(void)
{
    func_d();
}

void func_b(void)
{
    func_c();
}

void func_a(void)
{
    func_b();
}

int main(int argc, char *agrv[])
{
    func_a();
    printf("func_a=%p, func_b=%p, func_c=%p, func_d=%p, func_e=%p\n", func_a, func_b, func_c, func_d, func_e);	/* 打印函数地址 */
}

/*
 
 nm built_in_return_address


 */

